package hyy_2022;

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * 用栈实现队列
 * stack peek 和 stack pop
 * 相同点：都返回栈顶元素
 * 不同点：peek 不改变栈的值(不删除栈顶的值)，pop会把栈顶的值删除
 */
public class _0719_232_StackToQueue {

    Deque<Integer> inStack;
    Deque<Integer> outStack;

    public _0719_232_StackToQueue() {
        //输入栈,用于压入push传入的数据
        inStack = new ArrayDeque<>();
        //输出栈,用于pop 、peek操作
        outStack = new ArrayDeque<>();
    }


    public void push(int x) {
        inStack.push(x);
    }

    /**
     * 移除并返回队列头部元素
     * @return int
     */
    public int poll() {
        if(outStack.isEmpty()) {
            in2out();
        }
        //移除并返回栈顶部元素
        return outStack.pop();
    }

    /**
     * 返回队列头部元素
     * @return int
     */
    public int peek() {
        if(outStack.isEmpty()) {
            in2out();
        }
        //从堆栈中获取顶部元素
        return outStack.peek();
    }

    /**
     * 判断队列是否为空
     * @return boolean
     */
    public boolean empty() {
        return inStack.isEmpty() && outStack.isEmpty();
    }

    private void in2out() {
        while (!inStack.isEmpty()) {
            outStack.push(inStack.pop());
        }
    }

}
